{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 03 Network Architectures \n",
    "\n",
    "In this notebook, we investigate how we can work with more complicated network architectures than the simple MLP's.\n",
    "\n",
    "The example will be a Logistic-Hazard which use the encoded (latent) variables of an autoencoder as covariates.\n",
    "This means the network will have two heads, one for the autoencoder and the other for the Logistic-Hazard.\n",
    "\n",
    "To approach this task we can use the `LogisticHazard`, but we need to define the network structure that combines the survival net with an autoencoder.\n",
    "Also, we need to define a loss function that combines the loss of the `LogisticHazard` with that of the autoencoder."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# For preprocessing\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn_pandas import DataFrameMapper \n",
    "\n",
    "import torch # For building the networks \n",
    "from torch import nn\n",
    "import torch.nn.functional as F\n",
    "import torchtuples as tt # Some useful functions\n",
    "\n",
    "from pycox.datasets import metabric\n",
    "from pycox.models import LogisticHazard\n",
    "from pycox.models.loss import NLLLogistiHazardLoss\n",
    "from pycox.evaluation import EvalSurv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "## Uncomment to install `sklearn-pandas`\n",
    "# ! pip install sklearn-pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(1234)\n",
    "_ = torch.manual_seed(123)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dataset\n",
    "\n",
    "We load the METABRIC data set as a pandas DataFrame and split the data in in train, test and validation.\n",
    "\n",
    "The `duration` column gives the observed times and the `event` column contains indicators of whether the observation is an event (1) or a censored observation (0)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = metabric.read_df()\n",
    "df_test = df_train.sample(frac=0.2)\n",
    "df_train = df_train.drop(df_test.index)\n",
    "df_val = df_train.sample(frac=0.2)\n",
    "df_train = df_train.drop(df_val.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x0</th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>x3</th>\n",
       "      <th>x4</th>\n",
       "      <th>x5</th>\n",
       "      <th>x6</th>\n",
       "      <th>x7</th>\n",
       "      <th>x8</th>\n",
       "      <th>duration</th>\n",
       "      <th>event</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>5.603834</td>\n",
       "      <td>7.811392</td>\n",
       "      <td>10.797988</td>\n",
       "      <td>5.967607</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>56.840000</td>\n",
       "      <td>99.333336</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>5.284882</td>\n",
       "      <td>9.581043</td>\n",
       "      <td>10.204620</td>\n",
       "      <td>5.664970</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>85.940002</td>\n",
       "      <td>95.733330</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>6.654017</td>\n",
       "      <td>5.341846</td>\n",
       "      <td>8.646379</td>\n",
       "      <td>5.655888</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>66.910004</td>\n",
       "      <td>239.300003</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>5.456747</td>\n",
       "      <td>5.339741</td>\n",
       "      <td>10.555724</td>\n",
       "      <td>6.008429</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>67.849998</td>\n",
       "      <td>56.933334</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>5.425826</td>\n",
       "      <td>6.331182</td>\n",
       "      <td>10.455145</td>\n",
       "      <td>5.749053</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>70.519997</td>\n",
       "      <td>123.533333</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         x0        x1         x2        x3   x4   x5   x6   x7         x8  \\\n",
       "0  5.603834  7.811392  10.797988  5.967607  1.0  1.0  0.0  1.0  56.840000   \n",
       "1  5.284882  9.581043  10.204620  5.664970  1.0  0.0  0.0  1.0  85.940002   \n",
       "3  6.654017  5.341846   8.646379  5.655888  0.0  0.0  0.0  0.0  66.910004   \n",
       "4  5.456747  5.339741  10.555724  6.008429  1.0  0.0  0.0  1.0  67.849998   \n",
       "5  5.425826  6.331182  10.455145  5.749053  1.0  1.0  0.0  1.0  70.519997   \n",
       "\n",
       "     duration  event  \n",
       "0   99.333336      0  \n",
       "1   95.733330      1  \n",
       "3  239.300003      0  \n",
       "4   56.933334      1  \n",
       "5  123.533333      0  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature transforms\n",
    "\n",
    "The METABRIC dataset has  9 covariates: `x0, ..., x8`.\n",
    "We will standardize the 5 numerical covariates, and leave the binary covariates as is.\n",
    "Note that PyTorch require variables of type `'float32'`.\n",
    "\n",
    "We like using the `sklearn_pandas.DataFrameMapper` to make feature mappers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "cols_standardize = ['x0', 'x1', 'x2', 'x3', 'x8']\n",
    "cols_leave = ['x4', 'x5', 'x6', 'x7']\n",
    "\n",
    "standardize = [([col], StandardScaler()) for col in cols_standardize]\n",
    "leave = [(col, None) for col in cols_leave]\n",
    "\n",
    "x_mapper = DataFrameMapper(standardize + leave)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = x_mapper.fit_transform(df_train).astype('float32')\n",
    "x_val = x_mapper.transform(df_val).astype('float32')\n",
    "x_test = x_mapper.transform(df_test).astype('float32')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Label transforms\n",
    "\n",
    "The `LogisticHazard` is a discrete-time method, meaning it requires discretization of the event times to be applied to continuous-time data.\n",
    "We let `num_durations` define the size of this (equidistant) discretization grid, meaning our network will have `num_durations` output nodes.\n",
    "\n",
    "Note that we have two sets of targets.\n",
    "The first, `y_train_surv`, is for the survival and contains the labels `(idx_durations, events)`.\n",
    "The second is for the autoencoder (which is just the input covariates `x_train`).\n",
    "This is important to note, as it will define the call arguments of our loss function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_durations = 10\n",
    "labtrans = LogisticHazard.label_transform(num_durations)\n",
    "get_target = lambda df: (df['duration'].values, df['event'].values)\n",
    "y_train_surv = labtrans.fit_transform(*get_target(df_train))\n",
    "y_val_surv = labtrans.transform(*get_target(df_val))\n",
    "\n",
    "train = tt.tuplefy(x_train, (y_train_surv, x_train))\n",
    "val = tt.tuplefy(x_val, (y_val_surv, x_val))\n",
    "\n",
    "# We don't need to transform the test labels\n",
    "durations_test, events_test = get_target(df_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([2, 3, 6, ..., 1, 5, 3]),\n",
       " array([0., 1., 0., ..., 1., 0., 0.], dtype=float32))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_surv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that we have combined `idx_durations` and `events` intro the tuple `y_train_surv`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Neural Net\n",
    "\n",
    "We first define our network `NetAESurv` with contains the encoder, decoder, and the survival part. \n",
    "We also include a `predict` method that saves computations by not computing the decoder."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "class NetAESurv(nn.Module):\n",
    "    def __init__(self, in_features, encoded_features, out_features):\n",
    "        super().__init__()\n",
    "        self.encoder = nn.Sequential(\n",
    "            nn.Linear(in_features, 32), nn.ReLU(),\n",
    "            nn.Linear(32, 16), nn.ReLU(),\n",
    "            nn.Linear(16, encoded_features),\n",
    "        )\n",
    "        self.decoder = nn.Sequential(\n",
    "            nn.Linear(encoded_features, 16), nn.ReLU(),\n",
    "            nn.Linear(16, 32), nn.ReLU(),\n",
    "            nn.Linear(32, in_features),\n",
    "        )\n",
    "        self.surv_net = nn.Sequential(\n",
    "            nn.Linear(encoded_features, 16), nn.ReLU(),\n",
    "            nn.Linear(16, 16), nn.ReLU(),\n",
    "            nn.Linear(16, out_features),\n",
    "        )\n",
    "\n",
    "    def forward(self, input):\n",
    "        encoded = self.encoder(input)\n",
    "        decoded = self.decoder(encoded)\n",
    "        phi = self.surv_net(encoded)\n",
    "        return phi, decoded\n",
    "\n",
    "    def predict(self, input):\n",
    "        # Will be used by model.predict later.\n",
    "        # As this only has the survival output, \n",
    "        # we don't have to change LogisticHazard.\n",
    "        encoded = self.encoder(input)\n",
    "        return self.surv_net(encoded)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All methods in `pycox` are built on `torchtuples.Model`.\n",
    "The way `torchtuples` is made, a call to `model.predict` will use `model.net.predict` if it is defined, and use `model.net.forward` if `predict` is not defined.\n",
    "As all the survival predictions in `pycox` are based on the `model.predict` method, a call to `model.predict_surv` will use the `NetAESurv.predict` method instead of the `NetAESurv.forward` method.\n",
    "This way, the `model.predict_surv` methods will work as before!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "in_features = x_train.shape[1]\n",
    "encoded_features = 4\n",
    "out_features = labtrans.out_features\n",
    "net = NetAESurv(in_features, encoded_features, out_features)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Loss\n",
    "\n",
    "We need to define a loss that combines the `LogisticHazard` loss with the loss of an autoencoder `MLELoss`.\n",
    "The `forward` method defines how the loss is called, and need to be defined in accordance with how the data is structured.\n",
    "\n",
    "The first arguments need to be the output of the net (`phi` and `decoded` above), and the remainder of the arguments need to have the same structure as the tuple structure of the targets in your data set, that is `train[1]`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1, 1), 0)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train[1].levels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have structured our data such that `train[1] = (target_loghaz, target_ae)`, where `target_loghaz = (idx_durations, events)` and `target_ae` is just the input covariates.\n",
    "So we need a loss with the call signature  `loss(phi, decoded, target_loghaz, target_ae)`.\n",
    "We, therefore, create the following loss function (note that it is created in the same manner as a torch network)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LossAELogHaz(nn.Module):\n",
    "    def __init__(self, alpha):\n",
    "        super().__init__()\n",
    "        assert (alpha >= 0) and (alpha <= 1), 'Need `alpha` in [0, 1].'\n",
    "        self.alpha = alpha\n",
    "        self.loss_surv = NLLLogistiHazardLoss()\n",
    "        self.loss_ae = nn.MSELoss()\n",
    "        \n",
    "    def forward(self, phi, decoded, target_loghaz, target_ae):\n",
    "        idx_durations, events = target_loghaz\n",
    "        loss_surv = self.loss_surv(phi, idx_durations, events)\n",
    "        loss_ae = self.loss_ae(decoded, target_ae)\n",
    "        return self.alpha * loss_surv + (1 - self.alpha) * loss_ae"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss = LossAELogHaz(0.6)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The model\n",
    "\n",
    "We can now use the `LogisticHazard` model with the `net` and the `loss`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = LogisticHazard(net, tt.optim.Adam(0.01), duration_index=labtrans.cuts, loss=loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Testing that it works\n",
    "\n",
    "We can not test that everything works as expected by considering a single batch of data. This can be done by using the `make_dataloader` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "dl = model.make_dataloader(train, batch_size=5, shuffle=False)\n",
    "batch = next(iter(dl))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(torch.Size([5, 9]), ((torch.Size([5]), torch.Size([5])), torch.Size([5, 9])))"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "batch.shapes()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, ((2, 2), 1))"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "batch.levels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `compute_metrics` method is the \"brain\" of the `model` as it is responsible for computing the output of the network and calculating the loss.\n",
    "Here we also see the logic of how the loss function is called as we unpack the tuples `metric(*out, *target)`.\n",
    "To test that it works, we can call it with the batch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[0;31mSignature:\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompute_metrics\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mSource:\u001b[0m   \n",
       "    \u001b[0;32mdef\u001b[0m \u001b[0mcompute_metrics\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTensor\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0;34m\"\"\"Function for computing the loss and other metrics.\u001b[0m\n",
       "\u001b[0;34m        \u001b[0m\n",
       "\u001b[0;34m        Arguments:\u001b[0m\n",
       "\u001b[0;34m            data {tensor or tuple} -- A batch of data. Typically the tuple `(input, target)`.\u001b[0m\n",
       "\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m        Keyword Arguments:\u001b[0m\n",
       "\u001b[0;34m            metrics {dict} -- A dictionary with metrics. If `None` use `self.metrics`. (default: {None})\u001b[0m\n",
       "\u001b[0;34m        \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0;32mif\u001b[0m \u001b[0mmetrics\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m            \u001b[0mmetrics\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmetrics\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloss\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloss\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m            \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Need to set `self.loss`.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0minput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_to_device\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0mtarget\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_to_device\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtarget\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuplefy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m        \u001b[0;32mreturn\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mmetric\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mtarget\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetric\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mFile:\u001b[0m      ~/packages/torchtuples/torchtuples/base.py\n",
       "\u001b[0;31mType:\u001b[0m      method\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "??model.compute_metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'loss': tensor(2.1274, grad_fn=<AddBackward0>)}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.compute_metrics(batch)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, we can call the `score_in_batches` which computes the loss over the full data set. For larger data sets, this can be slow."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'loss': 2.1353516578674316}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.score_in_batches(*train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For better monitoring, we add some metrics that corresponds to the `LogisticHazard` loss and the `MSELoss`, but have the same call structure as `LossAELogHaz`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "metrics = dict(\n",
    "    loss_surv = LossAELogHaz(1),\n",
    "    loss_ae   = LossAELogHaz(0)\n",
    ")\n",
    "callbacks = [tt.cb.EarlyStopping()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now fit the model and plot the losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 256\n",
    "epochs = 100\n",
    "log = model.fit(*train, batch_size, epochs, callbacks, False, val_data=val, metrics=metrics)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "res = model.log.to_pandas()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>train_loss</th>\n",
       "      <th>train_loss_surv</th>\n",
       "      <th>train_loss_ae</th>\n",
       "      <th>val_loss</th>\n",
       "      <th>val_loss_surv</th>\n",
       "      <th>val_loss_ae</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2.012700</td>\n",
       "      <td>2.860405</td>\n",
       "      <td>0.741140</td>\n",
       "      <td>1.818385</td>\n",
       "      <td>2.615916</td>\n",
       "      <td>0.622087</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>1.676086</td>\n",
       "      <td>2.354524</td>\n",
       "      <td>0.658429</td>\n",
       "      <td>1.358614</td>\n",
       "      <td>1.878866</td>\n",
       "      <td>0.578235</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>1.307018</td>\n",
       "      <td>1.764166</td>\n",
       "      <td>0.621296</td>\n",
       "      <td>1.151025</td>\n",
       "      <td>1.565904</td>\n",
       "      <td>0.528707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>1.195468</td>\n",
       "      <td>1.619311</td>\n",
       "      <td>0.559702</td>\n",
       "      <td>1.038817</td>\n",
       "      <td>1.416264</td>\n",
       "      <td>0.472648</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>1.118429</td>\n",
       "      <td>1.528873</td>\n",
       "      <td>0.502764</td>\n",
       "      <td>1.049998</td>\n",
       "      <td>1.459745</td>\n",
       "      <td>0.435376</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   train_loss  train_loss_surv  train_loss_ae  val_loss  val_loss_surv  \\\n",
       "0    2.012700         2.860405       0.741140  1.818385       2.615916   \n",
       "1    1.676086         2.354524       0.658429  1.358614       1.878866   \n",
       "2    1.307018         1.764166       0.621296  1.151025       1.565904   \n",
       "3    1.195468         1.619311       0.559702  1.038817       1.416264   \n",
       "4    1.118429         1.528873       0.502764  1.049998       1.459745   \n",
       "\n",
       "   val_loss_ae  \n",
       "0     0.622087  \n",
       "1     0.578235  \n",
       "2     0.528707  \n",
       "3     0.472648  \n",
       "4     0.435376  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = res[['train_loss', 'val_loss']].plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = res[['train_loss_surv', 'val_loss_surv']].plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXxU1fnH8c8zk30hC0kgC4QAAWRfAioIIiqLIrggonXBVqkiLq1atYtVWn91rbYVxQ1rqyKIRVFRUAFxBQKEXZKwJ0AWlkAg68z5/XEDBkjCTEgyM+F5v17zmpk799x5cpVvbs4991wxxqCUUsr32TxdgFJKqYahga6UUs2EBrpSSjUTGuhKKdVMaKArpVQz4eepL46JiTHt2rXz1NcrpZRPWrlyZaExJramzzwW6O3atSM9Pd1TX6+UUj5JRHbU9pl2uSilVDOhga6UUs2EBrpSSjUTHutDV0p5l4qKCnJycigtLfV0KQoICgoiKSkJf39/l9tooCulAMjJySE8PJx27dohIp4u56xmjGHfvn3k5OSQkpLicjvtclFKAVBaWkrLli01zL2AiNCyZUu3/1rSQFdKHadh7j3q89/CY4G+r7jcU1+tlFLNkscCfe+hUkorHJ76eqWUanY8FuhOY1j8U76nvl4p5WUOHjzISy+95Ha7yy67jIMHD7rdbuLEicyZM8ftdt7MY4HuZxPmrs711NcrpbxMbYHucNT9l/z8+fOJjIxsrLJ8iseGLUaGBLB4cz4Hj5YTGRLgqTKUUjV4/OMNbNx9qEG32TWhBX++olutnz/88MNs2bKF3r174+/vT1hYGPHx8WRkZLBx40auvPJKdu3aRWlpKffeey+TJk0Cfp4Xqri4mFGjRnHBBRfw/fffk5iYyEcffURwcPBpa/vqq6944IEHqKyspH///rz88ssEBgby8MMPM2/ePPz8/Bg+fDjPPvss77//Po8//jh2u52IiAiWLl1a4za3b9/OTTfdxJEjRwB48cUXGThwIADPPPMMs2fPpqysjKuuuorHH3/c3d1ZIw8Guj9HHIZP1+3hF+cme6oMpZSXePLJJ1m/fj0ZGRksWbKEyy+/nPXr1x8fhz1jxgyio6MpKSmhf//+XHPNNbRs2fKEbWRlZTFz5kxee+01xo8fzwcffMCNN95Y5/eWlpYyceJEvvrqKzp16sTNN9/Myy+/zM0338zcuXP56aefEJHj3TpTp05lwYIFJCYm1tnVExcXxxdffEFQUBBZWVlcf/31pKens3DhQrKysli+fDnGGMaMGcPSpUsZMmTIGe5BDwZ6sL+dhLgwPlydq4GulJep60i6qQwYMOCEi2r++c9/MnfuXAB27dpFVlbWKYGekpJC7969AejXrx/bt28/7fds3ryZlJQUOnXqBMAtt9zCtGnTmDJlCkFBQdx2221cfvnljB49GoBBgwYxceJExo8fz9VXX13rdisqKpgyZQoZGRnY7XYyMzMBWLhwIQsXLqRPnz4AFBcXk5WV5duBDnBln0SeWbCZXfuP0iY6xJOlKKW8TGho6PHXS5Ys4csvv+SHH34gJCSEoUOH1njRTWBg4PHXdrudkpKS036PMabG5X5+fixfvpyvvvqK9957jxdffJFFixYxffp0li1bxqeffkrv3r3JyMg45RcLwPPPP0+rVq1Ys2YNTqeToKCg49/3yCOP8Otf//q0tbnLoxcWje2dAMBHGXpyVKmzXXh4OIcPH67xs6KiIqKioggJCeGnn37ixx9/bLDv7dKlC9u3byc7OxuA//73v1x44YUUFxdTVFTEZZddxgsvvEBGRgYAW7Zs4dxzz2Xq1KnExMSwa9euWmuOj4/HZrPx3//+9/jJ3REjRjBjxgyKi4sByM3NJT+/YUb8efQIPSkqhAEp0cxdnctdF3XUq9SUOou1bNmSQYMG0b17d4KDg2nVqtXxz0aOHMn06dPp2bMnnTt35rzzzmuw7w0KCuLNN9/k2muvPX5S9I477mD//v2MHTuW0tJSjDE8//zzADz44INkZWVhjOHiiy+mV69eNW538uTJXHPNNbz//vtcdNFFx//iGD58OJs2beL8888HICwsjLfffpu4uLgz/lmktj83GltaWppJT09n5vKdPPK/dcybMoieSTr0SClP2bRpE+ecc46ny1DV1PTfRERWGmPSalrfpS4XERkpIptFJFtEHq7h8+dFJKPqkSkiLo/yv6x7PAF2m45JV0qpM3TaLhcRsQPTgEuBHGCFiMwzxmw8to4x5jfV1r8b6ONqAREh/gzrEsfHa3bzh8vOwc+u84UppRrOXXfdxXfffXfCsnvvvZdbb721Qba/YMECHnrooROWpaSkHB+R05Rc6UMfAGQbY7YCiMh7wFhgYy3rXw/82Z0iruyTyOcb9vJtdiFDO595P5JSSh0zbdq0Rt3+iBEjGDFiRKN+h6tcORxOBKqfxs2pWnYKEUkGUoBFtXw+SUTSRSS9oKDg+PKLusQSEezPh9rtopRS9eZKoNc09KS2M6kTgDnGmBonXzDGvGqMSTPGpMXGxh5fHuhn5/Ke8SzYkMeRskoXSlJKKXUyVwI9B2hT7X0SsLuWdScAM+tTyFV9EimpcLBw4976NFdKqbOeK4G+AkgVkRQRCcAK7XknryQinYEo4If6FNKvbRRJUcHMXV3b7wqllFJ1OW2gG2MqgSnAAmATMNsYs0FEporImGqrXg+8Z+o5sN1mE67snci3WQXkH9a7jiul6hYWFlbrZ9u3b6d79+5NWI13cGmMoDFmvjGmkzGmgzHmiapljxpj5lVb5zFjzClj1N1xZZ8EnAbmZehRulJKucujl/6frGNcOD0SI/gwI5fbBrf3dDlKnb0+exj2rmvYbbbuAaOerPXjhx56iOTkZCZPngzAY489hoiwdOlSDhw4QEVFBX/9618ZO3asW19bWlrKnXfeSXp6On5+fvz973/noosuYsOGDdx6662Ul5fjdDr54IMPSEhIYPz48eTk5OBwOPjTn/7EddddV+N2p06dyscff0xJSQkDBw7klVdeQUTYsmULd911FwUFBYSEhPDaa6/RpUsXt2quL6+7iufKPomszz1EVl7Nk/QopZqnCRMmMGvWrOPvZ8+eza233srcuXNZtWoVixcv5v777691dsTaHBuHvm7dOmbOnMktt9xCaWkp06dP59577yUjI4P09HSSkpL4/PPPSUhIYM2aNaxfv56RI0fWut0pU6awYsUK1q9fT0lJCZ988gkAkyZN4l//+hcrV67k2WefPf4Lqil41RE6wBW94nni0418mJHLgyOa5reaUuokdRxJN5Y+ffqQn5/P7t27KSgoICoqivj4eH7zm9+wdOlSbDYbubm55OXl0bp1a5e3++2333L33XcD1syKycnJZGZmcv755/PEE0+Qk5PD1VdfTWpqKj169OCBBx7goYceYvTo0QwePLjW7S5evJinn36ao0ePsn//frp168ZFF13E999/z7XXXnt8vbKysvrvFDd53RF6XHgQF6TG8uHq3Tidnpk4TCnlGePGjWPOnDnMmjWLCRMm8M4771BQUMDK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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = res[['train_loss_ae', 'val_loss_ae']].plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prediction\n",
    "\n",
    "For prediction, remember that `model.predict` use the `net.predict` method, and because we defined it as only the survival part, the `predict_surv_df` behave as before."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "surv = model.interpolate(10).predict_surv_df(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "surv.iloc[:, :5].plot(drawstyle='steps-post')\n",
    "plt.ylabel('S(t | x)')\n",
    "_ = plt.xlabel('Time')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Under you can see that the `model.predict` method gives an array out, as the `model.net.predict` only gives an array (or tensor). \n",
    "\n",
    "If we want predictions from the `net.forward` method, we can use `model.predict_net` instead."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-13.314146  ,  -3.232014  ,  -1.6640139 ,  -0.32413414,\n",
       "         -0.17921695,  -0.24341404,   0.09743847,   0.6742561 ,\n",
       "         -0.08086838,   9.740675  ],\n",
       "       [-12.070942  ,  -1.3327147 ,  -1.0963962 ,  -2.2161934 ,\n",
       "         -2.0299942 ,  -2.0760274 ,  -1.5875834 ,  -0.576796  ,\n",
       "          0.6470416 ,   8.179644  ]], dtype=float32)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict(x_test[:2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[-13.314146  ,  -3.232014  ,  -1.6640139 ,  -0.32413414,\n",
       "          -0.17921695,  -0.24341404,   0.09743847,   0.6742561 ,\n",
       "          -0.08086838,   9.740675  ],\n",
       "        [-12.070942  ,  -1.3327147 ,  -1.0963962 ,  -2.2161934 ,\n",
       "          -2.0299942 ,  -2.0760274 ,  -1.5875834 ,  -0.576796  ,\n",
       "           0.6470416 ,   8.179644  ]], dtype=float32),\n",
       " array([[-0.87191707,  1.8376998 ,  0.52234185,  1.4613888 ,  0.8503939 ,\n",
       "          0.93256044,  0.82951564,  0.15673046,  1.0731695 ],\n",
       "        [ 0.05569835, -0.8430163 ,  2.3545551 ,  0.93773973, -1.2269706 ,\n",
       "          0.38499445,  0.79142815,  0.6561861 ,  0.33640665]],\n",
       "       dtype=float32))"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict_net(x_test[:2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also pass a function to the `predict` methods, so we can only get the survival part from `predict_net`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-13.314146  ,  -3.232014  ,  -1.6640139 ,  -0.32413414,\n",
       "         -0.17921695,  -0.24341404,   0.09743847,   0.6742561 ,\n",
       "         -0.08086838,   9.740675  ],\n",
       "       [-12.070942  ,  -1.3327147 ,  -1.0963962 ,  -2.2161934 ,\n",
       "         -2.0299942 ,  -2.0760274 ,  -1.5875834 ,  -0.576796  ,\n",
       "          0.6470416 ,   8.179644  ]], dtype=float32)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict_net(x_test[:2], func=lambda x: x[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluation (as before)\n",
    "\n",
    "The `EvalSurv` class contains some useful evaluation criteria for time-to-event prediction.\n",
    "We set `censor_surv = 'km'` to state that we want to use Kaplan-Meier for estimating the censoring distribution.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "ev = EvalSurv(surv, durations_test, events_test, censor_surv='km')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Concordance\n",
    "\n",
    "We start with the event-time concordance by [Antolini et al. 2005](https://onlinelibrary.wiley.com/doi/10.1002/sim.2427)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6662427402602908"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ev.concordance_td('antolini')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Brier Score\n",
    "\n",
    "We can plot the the [IPCW Brier score](https://onlinelibrary.wiley.com/doi/abs/10.1002/%28SICI%291097-0258%2819990915/30%2918%3A17/18%3C2529%3A%3AAID-SIM274%3E3.0.CO%3B2-5) for a given set of times.\n",
    "Here we just use 100 time-points between the min and max duration in the test set.\n",
    "Note that the score becomes unstable for the highest times. It is therefore common to disregard the rightmost part of the graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "time_grid = np.linspace(durations_test.min(), durations_test.max(), 100)\n",
    "ev.brier_score(time_grid).plot()\n",
    "plt.ylabel('Brier score')\n",
    "_ = plt.xlabel('Time')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Negative binomial log-likelihood\n",
    "\n",
    "In a similar manner, we can plot the the [IPCW negative binomial log-likelihood](https://onlinelibrary.wiley.com/doi/abs/10.1002/%28SICI%291097-0258%2819990915/30%2918%3A17/18%3C2529%3A%3AAID-SIM274%3E3.0.CO%3B2-5)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ev.nbll(time_grid).plot()\n",
    "plt.ylabel('NBLL')\n",
    "_ = plt.xlabel('Time')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Integrated scores\n",
    "\n",
    "The two time-dependent scores above can be integrated over time to produce a single score [Graf et al. 1999](https://onlinelibrary.wiley.com/doi/abs/10.1002/%28SICI%291097-0258%2819990915/30%2918%3A17/18%3C2529%3A%3AAID-SIM274%3E3.0.CO%3B2-5). In practice this is done by numerical integration over a defined `time_grid`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.16289642991716796"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ev.integrated_brier_score(time_grid) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4834288744418562"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ev.integrated_nbll(time_grid) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Next\n",
    "\n",
    "You can now look at other examples of survival methods in the [examples folder](https://nbviewer.jupyter.org/github/havakv/pycox/tree/master/examples).\n",
    "Or, alternatively take a look at\n",
    "\n",
    "- the more advanced training procedures in the notebook [02_introduction.ipynb](https://nbviewer.jupyter.org/github/havakv/pycox/blob/master/examples/02_introduction.ipynb).\n",
    "- working with DataLoaders and convolutional networks in the notebook [04_mnist_dataloaders_cnn.ipynb](https://nbviewer.jupyter.org/github/havakv/pycox/blob/master/examples/04_mnist_dataloaders_cnn.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
